#include "es_soft_iic.h"




void i2c_delay_us(u16 t) {
	u16 i = 0;
	while (t--)
	{
		i = 10;
		while (i--);
	}
}


  
void i2c_init()  
{  
     GPIO_InitTypeDef  GPIO_InitStructure;  
          
      GPIO_InitStructure.GPIO_Pin =  I2C_EE_SCL | I2C_EE_SDA;  
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO_Speed_50MHz;  
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  
      GPIO_Init(I2C_EE_GPIO, &GPIO_InitStructure);  
}  
  
  
void i2c_start()  
{  
    SDA_H;  
    SCL_H;  
    i2c_delay_us(i2c_dTime);  
    SDA_L;  
    i2c_delay_us(i2c_dTime);  
    SCL_L;  
    i2c_delay_us(i2c_dTime);  
  
 // LedStatus = !LedStatus;  
    //f_LCT1(LedStatus);  
}  
  
  
  
/*  
******************************************************************  
Fuction:  
Stop i2c  
******************************************************************  
*/  
void i2c_stop()  
{  
    SDA_L;  
    SCL_H;  
    i2c_delay_us(i2c_dTime);  
    SDA_H;  
    i2c_delay_us(i2c_dTime);  
    SCL_H;  
    i2c_delay_us(i2c_dTime);  
}  
  
/* 
****************************************************************** 
Fuction: 
i2c  Master wait for ack 
Only ack 
****************************************************************** 
*/  
u8 i2c_rd_ack()  
{  
    u8 flag = 0;  
    SDA_H;  
    SCL_H;  
    i2c_delay_us(i2c_dTime/2);  
    flag = SDA_read;  
    i2c_delay_us(i2c_dTime/2);  
    SCL_L;  
    i2c_delay_us(i2c_dTime/2);  
    if(flag == 1)  
        return 0;  
    return 1;  
}  
  
/* 
****************************************************************** 
Fuction: 
i2c  Byte transmission 
Only Send,no ack,no stop 
****************************************************************** 
*/  
u8 i2c_sb(u8 Byte)  
{  
    u8 cnt;  
    SCL_L;  		//从机是在SCL为高时读取的
    for(cnt=0;cnt<8;cnt++)  
     {  
  
      if(Byte&0x80)  	//MSB->LSB，由高位开始发送
       SDA_H;  
       else  
       SDA_L;  
   
       i2c_delay_us(i2c_dTime);  
       SCL_H;  	//这时从机开始读数据
       i2c_delay_us(i2c_dTime);  
       SCL_L;  
			
       Byte <<= 1;  		//左移
       i2c_delay_us(i2c_dTime);  
     }  
  
     return i2c_rd_ack();  	//等待ack，当SDA被从机拉低表示收到数据
  
}  
  
  
  
  
/* 
****************************************************************** 
Fuction: 
i2c  Byte receive 
Return Byte 
****************************************************************** 
*/  
u8 i2c_rb()  
{  
    u8 cnt;  
    u8 Byte=0;  
  
    SDA_H;  
    for(cnt=0;cnt<8;++cnt)  
      {  
  
         Byte <<= 1;  
         i2c_delay_us(i2c_dTime);  
         SCL_H;  
         i2c_delay_us(i2c_dTime);  
         if(SDA_read)  
             Byte |= 0x01;  
         SCL_L;  
         i2c_delay_us(i2c_dTime);  
      }  
    return Byte;  
}  
  
  
  
/* 
****************************************************************** 
Fuction: 
i2c  ACK  Master send 
****************************************************************** 
*/  
void i2c_wr_ack(u8 ACK)  
{  
    if(ACK)  
    SDA_H;  
    else  
    SDA_L;  
    SCL_H;  
    i2c_delay_us(i2c_dTime);  
    SCL_L;  
    i2c_delay_us(i2c_dTime);  
}  
  
  
/* 
****************************************************************** 
Fuction: 
i2c  Byte receive 
Return Byte 
****************************************************************** 
*/  
u8 i2c_ReadReg(u8 slaveAddr,u8 addr)  
{  
        u8 temp;  
  
        i2c_start();  
        if(!i2c_sb(slaveAddr))  
        {  
                i2c_stop();  
                return 0;  
        }  
  
        if(!i2c_sb(addr))  
        {  
            i2c_stop();  
            return 0;  
        }  
  
        i2c_start();  
  
        if(!i2c_sb(slaveAddr |0x01))  
        {  
                i2c_stop();  
                return 0;  
        }  
        temp = i2c_rb();  
        i2c_wr_ack(1);  
        i2c_stop();  
        return temp;  
}  


u8 i2c_WriteReg8(u8 slaveAddr,u8 addr,u8 wData)  
{  
    i2c_start();  
    if(!i2c_sb(slaveAddr))  
        {  
                i2c_stop();  
                return 0;  
        }  
  	  
        if(!i2c_sb(addr))
        {  
            i2c_stop();  
            return 0;  
        }  
  
        if(!i2c_sb(wData))  
        {  
            i2c_stop();  
            return 0;  
        }  
          
    i2c_stop();  
    //i2c_delay_us(1);  
    return 1;     
}  
  
u8 i2c_WriteReg16(u8 slaveAddr,u8 addr,u8 wData1,u8 wData2)  
{  
    i2c_start();  
    if(!i2c_sb(slaveAddr))  
        {  
                i2c_stop();  
                return 0;  
        }  
    
        if(!i2c_sb(addr)) 
        {  
            i2c_stop();  
            return 0;  
        }  
  
        if(!i2c_sb(wData2))  
        {  
                i2c_stop();  
                return 0;  
        }  
  
        if(!i2c_sb(wData1))  
        {  
            i2c_stop();  
            return 0;  
        }  
  
    i2c_stop();  
    //i2c_delay_us(1);  
    return 1;     
}  
  
  
u8 i2c_WriteReg32(u8 slaveAddr,u8 addr,u8 wData1,u8 wData2,u8 wData3,u8 wData4)  
{  
    i2c_start();  
    if(!i2c_sb(slaveAddr))  
        {  
                i2c_stop();  
                return 0;  
        }  
  
      
        if(!i2c_sb(addr))
        {  
            i2c_stop();  
            return 0;  
        }  
  
        if(!i2c_sb(wData4))
        {  
                i2c_stop();  
                return 0;  
        }  
  
        if(!i2c_sb(wData3)) 
        {  
            i2c_stop();  
            return 0;  
        }  
  
        if(!i2c_sb(wData2))
        {  
                i2c_stop();  
                return 0;  
        }  
  
        if(!i2c_sb(wData1)) 
        {  
            i2c_stop();  
            return 0;  
        }  
  
    i2c_stop();  
    //i2c_delay_us(1);  
    return 1;  
}  

